package com.gyyweishang.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Slf4j//@Slf4j注解用于定义一个日志对象
//@Aspect//@Aspect注解用于定义一个切面
@Component//@Component注解用于定义一个Bean
public class MyAspect {
    //公共的切点表单式
    @Pointcut("execution(* com.gyyweishang.service.impl.*.*(..))")
    public void pointcut(){}
    //环绕通知  目标方法执行前、后运行
    @Around("execution(* com.gyyweishang.service.impl.*.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        log.info("around....before.....");
        Object result = pjp.proceed();
        log.info("around....after.....");
        return result;
    }
    //前置通知
    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
        log.info("before");
        //获取目标对象
        Object target = joinPoint.getTarget();

        //获取目标方法参数
        Object[] args = joinPoint.getArgs();

        //获取目标方法
        String methodName = joinPoint.getSignature().getName();

        //获取目标类
        String className = joinPoint.getTarget().getClass().getName();

    }
    //后置通知，在目标方法执行后执行
    @After("pointcut()")
    public void after(){
        log.info("after");
    }
    //后置异常通知，在目标方法抛出异常后执行
    @AfterThrowing("pointcut()")
    public void afterThrowing(){
        log.info("afterThrowing");
    }
    //后置返回通知，在目标方法正常返回后执行
    @AfterReturning("pointcut()")
    public void afterReturning(){
        log.info("afterReturning");
    }


}
